const express = require('express')
const cors = require('cors')
const path = require('path')

const app = express()
const bodyParser = require('body-parser')

const router = require('./router')

// 5. 第三方中间件
// 解决跨域
app.use(cors())
// 解析 form body
app.use(bodyParser.urlencoded({extended: false}))
// 解析 JSON body
app.use(bodyParser.json())
app.use(bodyParser.raw())
app.use(bodyParser.text())

// $.ajax({
//   url: '/api/...',
//   'content-type': 'application/x-www-form-urlencoded',
//   data: {
//     username: 'yidong',
//     age: 18
//   }
// })

// $.ajax({
//   url: '/api/...',
//   'content-type': 'application/json',
//   data: JSON.stringify({
//     username: 'yidong',
//     age: 18
//   })
// })

// username=yidong&age=18
// {"username": "yidong", "age": 18}

// 4. 内置中间件
app.use('/aaa', express.static('./public', {
  index: 'index',
  extensions: ['html', 'php', 'jsp']
}))

// 引用中间件, 中间件就是一个函数
// 中间件栈, 执行顺序：从上到下，从左到右

// 1. 应用中间件
// app.use('/api', (req, res, next) => {
//   res.send('world')
//   // console.log(0)
//   next()
// }, (req, res, next) => {
//   console.log(1000)
//   next()
// })

// app.use((req, res, next) => {
//   // res.send('hello')
//   console.log(100)
// })

// CRUD
// get: 查询数据 (retrieve)
// post: 添加数据 (add)
// put: 修改数据 (update) : 全量修改
// patch: 修改数据 (update) : 增量修改
// delete: 删除数据 (delete)

// 1xx: pending...
// 2xx: ok
// 3xx: redirect
// 4xx: client error 403: forbidden
// 5xx: server error

// const m1 = (req, res, next) => {
//   // res.json({x: 0})
//   console.log(0)
//   next()
// }

// const m2 = (req, res, next) => {
//   // res.json({y: 0})
//   console.log(1)
//   res.sendStatus(304)
//   next()
// }

// app.all(/.*/, [m2, m1], function() {
//   console.log(3)
// })

// /api RestFul  /api/users/...

// RMVC: R-Router(Request路由&请求)、C-Controller(控制器)、V-View(视图)、M-model(模型-数据)

app.use('/api', router)

app.engine('art', require('express-art-template'))
app.set('view options', {
  // debug: process.env.NODE_ENV !== 'production',
  escape: false
})
// 设置views的路径
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'art')

// 3. 错误处理中间件
// app.use((err, req, res, next) => {
//   // console.log('err')
//   console.log(err)
//   // res.send('后台发生错误，请于管理员联系')
// })

app.listen(8080, () => {
  console.log('localhost:8080')
})